/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.future.projects.imobiliaria.dao;

import com.future.projects.imobiliaria.exception.DAOException;
import com.future.projects.imobiliaria.model.Usuario;
import com.future.projects.imobiliaria.util.MessageHelper;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author fernandofot
 */
public class HibernateUsuarioDAO implements UsuarioDAO {

    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Override
    public Long create(Usuario usuario) throws DAOException {
        Session session = sessionFactory.getCurrentSession();

        try {
            Long id = (Long) session.save(usuario);

            return id;
        } catch (HibernateException e) {

            Logger.getLogger(HibernateUsuarioDAO.class.getName()).log(
                    Level.SEVERE, null, e);
            throw new DAOException(MessageHelper.getMessage("usuario.create.error"));

        }
    }

    @Override
    public void update(Usuario usuario) throws DAOException {
        Session session = sessionFactory.getCurrentSession();

        try {
            session.update(usuario);

        } catch (HibernateException e) {

            Logger.getLogger(HibernateUsuarioDAO.class.getName()).log(
                    Level.SEVERE, null, e);
            throw new DAOException(MessageHelper.getMessage("usuario.create.error"));

        }
    }

    @Override
    public void remove(Long id) throws DAOException {
        Session session = sessionFactory.getCurrentSession();

        try {
            Usuario usuario = find(id);
            session.delete(usuario);

        } catch (HibernateException e) {

            Logger.getLogger(HibernateUsuarioDAO.class.getName()).log(
                    Level.SEVERE, null, e);
            throw new DAOException(MessageHelper.getMessage("usuario.create.error"));

        }
    }

    @Override
    public Usuario find(Long id) throws DAOException {
        Session session = sessionFactory.getCurrentSession();

        try {
            Usuario usuario = (Usuario) session.get(Usuario.class, id);
            return usuario;

        } catch (HibernateException e) {

            Logger.getLogger(HibernateUsuarioDAO.class.getName()).log(
                    Level.SEVERE, null, e);
            throw new DAOException(MessageHelper.getMessage("usuario.create.error"));

        }
    }

    @Override
    public Usuario findByLogin(String login) throws DAOException {
        Session session = sessionFactory.getCurrentSession();

        try {
            Usuario usuario = (Usuario) session.createQuery("from Usuario u where u.login=:login")
                    .setString("login", login).uniqueResult();
            return usuario;

        } catch (HibernateException e) {

            Logger.getLogger(HibernateUsuarioDAO.class.getName()).log(
                    Level.SEVERE, null, e);
            throw new DAOException(MessageHelper.getMessage("usuario.create.error"));

        }
    }

    @Override
    public List<Usuario> listUsuarios() throws DAOException {
        Session session = sessionFactory.getCurrentSession();

        try {
            List<Usuario> usuarios
                    = session.createQuery("from Usuario u")
                    .list();
            return usuarios;

        } catch (HibernateException e) {

            Logger.getLogger(HibernateUsuarioDAO.class.getName()).log(
                    Level.SEVERE, null, e);
            throw new DAOException(MessageHelper.getMessage("usuario.create.error"));

        }
    }

    @Override
    public List<Usuario> searchUsuarios(String term) throws DAOException {
        Session session = sessionFactory.getCurrentSession();

        try {
            Criteria criteria = session.createCriteria(Usuario.class);

            if (term != null) {
                criteria = criteria.add(Restrictions.ilike("codigo", "%" + term + "%"));
            }

           
            List<Usuario> usuarios = criteria.list();
            
            return usuarios;


        } catch (HibernateException e) {

            Logger.getLogger(HibernateUsuarioDAO.class.getName()).log(
                    Level.SEVERE, null, e);
            throw new DAOException(MessageHelper.getMessage("usuario.create.error"));

        }
    }

}
